/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveGroup;
import kr.pe.johnkim.dayve.provider.DayveGroupDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * 카테고리를 등록하는 클래스이다.
 * 
 * 1. 카테고리 명으로 중복 등록검사를 한다.
 * 2. 새로운 카테고리를 등록하고 카테고리 목록 페이지로 돌아온다.
 * 
 * @author johnkim
 *
 */
public class DayveCategoryRegisterView extends Activity {

	public static final String TAG = DayveCategoryRegisterView.class.getSimpleName();
	
	ProgressBar registerCategoryProgressBar;
	
	// 현재 시간.
	private String currentDate;
	
	// 선택 Group name.
//	TextView txtViewRegisterCategoryName;
	
	// 선택 Group comment.
//	TextView txtViewRegisterCategoryComment;
	
	// Category Icon
	ImageView imgViewCategoryRegisterCategoryIcon;
	
	// Category Icon Select
	ImageView imgViewCategoryRegisterCategoryIconSelect;
	
	// 카테고리명 중복 검사 버튼.
	Button btnCheckDuplicationRegisterCategory;
	
	// Comment 글자 수.
	TextView txtViewRegisterCategoryCommentCount;
	
	// Comment 입력 란.
	EditText edtTextRegisterCategoryComment;
	
	// Group 선택 스피너.
	Spinner spnRegisterCategorySelectGroup;
	
	// 카테고리 등록 버튼.
	Button btnRegisterCategory;
	
	// 카테고리명 입력란.
	EditText edtRegisterCategoryName;
	
	// Group Unit Time Layout
	LinearLayout linearLayoutGroupUnitTime;
	
	// Group Unit
	Spinner spnGroupUnit;
	
	// Group Unit Time
	Spinner spnGroupUnitTime;
	
	// 로그를 저장한다.
	private static final int THREAD_INSERT_LOG = 100;
	
	// 카테고리명 중복 검사를 한다.
	private static final int THREAD_CHECK_DUPLICATION = 101;
	
	// 카테고리를 등록 한다.
	private static final int THREAD_CATEGORY_REGISTER = 102;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 103;
	
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 104;
	
	// 카테고리 저장 성공하면 토스트를 띄운다.
	private static final int THREAD_PROGRESS_REGISTER_SUCCESS = 105;
	
	// 카테고리 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
	private static final int THREAD_PROGRESS_REGISTER_FAIL = 106;
	
	// 카테고리명 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_AVAILABLE = 107;
	
	// 카테고리명 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_UNAVAILABLE = 108;
	
	// 카테고리명 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_ERROR = 109;
	
	DayveCategoryRest dayveCategoryRest = new DayveCategoryRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();
	
	// 카테고리명 중복 검사 결과.
	private String RESULT_CHECK_DUPLICATION = "";
		
	// 카테고리 저장 결과.
	private String RESULT_CATEGORY_REGISTER = "";

	// 아이디.
	private String DAYVE_ID = "";
	
	// Group name.
	private String DAYVE_GROUP_NAME = "";
	
	// Group id.
	private String DAYVE_GROUP_ID = "";
	
	// 중복 확인 버튼 눌렀는지 체크.
	private int CHECK_DUPLICATION  = 0;
	
	private String GROUP_UNIT = "";
	
	private String GROUP_UNIT_TIME = "";
	
	// DatabaseHandler
//	private DatabaseHandler dbHandler;

	// Group DatabaseHandler
	private DayveGroupDatabaseHandler groupDatabaseHandler;

	// Spinner 파라메터로 사용할 group name.
	public String SPINNER_GROUP_NAME = "";

	// Spinner group name position.
	public int SPINNER_GROUP_NAME_POSITION = 0;
	
	private String groupId = "";
	
	LinearLayout linearLayoutCategoryRegisterAmount;
	
	public static String DAYVE_CATEGORY_ICON_URL = "dayve_group_default";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dayve_category_register);
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		// 설정을 가져 온다.
		confirmNotification();
		
		Intent i = getIntent();
		DAYVE_GROUP_ID = i.getStringExtra("groupId");

		// DatabaseHandler 를 연다.
//		dbHandler = DatabaseHandler.open(getApplicationContext());
		
		groupDatabaseHandler = DayveGroupDatabaseHandler.open(getApplicationContext());
		
//		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
//		linearLayoutGroupUnitTime = (LinearLayout)findViewById(R.id.line)
		
		/**
		 * Amount 단위는 일반(GENERAL), 시간(TIME)으로 나뉘어져 있으나
		 * 현재는 단위에 따른 분석, 사용방법에 대해서 모호한 점이 많기 때문에
		 * LAYOUT 에 넣고 감춘다.
		 * 
		 * 추후 사용시 GONE 을 풀고 사용 한다.
		 * 
		 * parameterCategory.setGroupUnit("GENERAL");
		 * parameterCategory.setGroupUnitTime("");
		 * 
		 * parameterCategory.setGroupUnit(GROUP_UNIT);
		 * parameterCategory.setGroupUnitTime(GROUP_UNIT_TIME);
		 * 
		 * 으로 수정해서 사용할 것.
		 */
//		linearLayoutCategoryRegisterAmount = (LinearLayout)findViewById(R.id.linearLayoutCategoryRegisterAmount);
//		linearLayoutCategoryRegisterAmount.setVisibility(View.GONE);
//		
//		// 최초 화면 출력시 Time Amount 선택 Spinner 는 감춘다.
//		linearLayoutGroupUnitTime = (LinearLayout)findViewById(R.id.linearLayoutGroupUnitTime);
//		linearLayoutGroupUnitTime.setVisibility(View.GONE);
//		
//		// Amount 단위 선택.
//		spnGroupUnit = (Spinner)findViewById(R.id.spnGroupUnit);
//		ArrayAdapter<CharSequence> groupUnitAdapter = ArrayAdapter.createFromResource(this, R.array.group_unit, android.R.layout.simple_spinner_item);
//		groupUnitAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//		spnGroupUnit.setAdapter(groupUnitAdapter);
//		spnGroupUnit.setOnItemSelectedListener(new OnItemSelectedListener() {
//
//			public void onItemSelected(AdapterView<?> arg0, View arg1,
//					int position, long id) {
//				// TODO Auto-generated method stub
//				if(id == 0) {
//					GROUP_UNIT = "GENERAL";
//					GROUP_UNIT_TIME = "";
//					linearLayoutGroupUnitTime.setVisibility(View.GONE);
//				} else if(id == 1) {
//					GROUP_UNIT = "TIME";
//					linearLayoutGroupUnitTime.setVisibility(View.VISIBLE);
//				}
//				
//				Log.i(TAG, "> GROUP_UNIT : " + GROUP_UNIT);
//			}
//
//			public void onNothingSelected(AdapterView<?> arg0) {
//				// TODO Auto-generated method stub
//				
//			}
//			
//		});
//		
//		// Time Amount 단위 선택.(분/시)
//		spnGroupUnitTime = (Spinner)findViewById(R.id.spnGroupUnitTime);
//		ArrayAdapter<CharSequence> groupUnitTimeAdapter = ArrayAdapter.createFromResource(this, R.array.group_unit_time, android.R.layout.simple_spinner_item);
//		groupUnitTimeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//		spnGroupUnitTime.setAdapter(groupUnitTimeAdapter);
//		spnGroupUnitTime.setOnItemSelectedListener(new OnItemSelectedListener() {
//
//			public void onItemSelected(AdapterView<?> arg0, View arg1,
//					int position, long id) {
//				// TODO Auto-generated method stub
//				if((("TIME").equals(GROUP_UNIT)) && (id == 0)) {
//					GROUP_UNIT_TIME = "MINUTE";
//				} else if((("TIME").equals(GROUP_UNIT)) && (id == 1)) {
//					GROUP_UNIT_TIME = "HOUR";
//				}
//				
//				Log.i(TAG, "> GROUP_UNIT_TIME : " + GROUP_UNIT_TIME);
//			}
//
//			public void onNothingSelected(AdapterView<?> arg0) {
//				// TODO Auto-generated method stub
//				
//			}
//			
//		});
		
//		txtViewRegisterCategoryName = (TextView)findViewById(R.id.txtViewRegisterCategoryGroupName);
//		
//		txtViewRegisterCategoryComment = (TextView)findViewById(R.id.txtViewRegisterCategoryGroupComment);
		
		// 프로그레스 바를 설정 한다.
		registerCategoryProgressBar = (ProgressBar)findViewById(R.id.registerCategoryProgressBar);
		
		imgViewCategoryRegisterCategoryIcon = (ImageView)findViewById(R.id.imgViewCategoryRegisterCategoryIcon);
		imgViewCategoryRegisterCategoryIcon.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent(DayveCategoryRegisterView.this, DayveGroupSelectIconView.class);
				i.putExtra("parent_activity_name", "DayveCategoryRegisterView");
				startActivityForResult(i, 0);
			}
			
		});
		
		imgViewCategoryRegisterCategoryIconSelect = (ImageView)findViewById(R.id.imgViewCategoryRegisterCategoryIconSelect);
		imgViewCategoryRegisterCategoryIconSelect.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent(DayveCategoryRegisterView.this, DayveGroupSelectIconView.class);
				i.putExtra("parent_activity_name", "DayveCategoryRegisterView");
				startActivityForResult(i, 0);
			}
			
		});
		
		btnCheckDuplicationRegisterCategory = (Button)findViewById(R.id.btnCheckDuplicationRegisterCategory);
		btnRegisterCategory = (Button)findViewById(R.id.btnRegisterCategory);
		edtRegisterCategoryName = (EditText)findViewById(R.id.edtTxtRegisterCategoryName);
		edtRegisterCategoryName.requestFocus();
		
		// 카테고리명을 입력하고 중복검사 버튼을 터치 한다.
		btnCheckDuplicationRegisterCategory.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				// 중복 확인 버튼 눌렀을때 확인 값을 증가 시킨다.
				CHECK_DUPLICATION++;
				
				if(("").equals(edtRegisterCategoryName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveCategoryRegisterView.this)
					.setTitle(getResources().getString(R.string.category_register_category_check_duplication_title))
					.setMessage(getResources().getString(R.string.category_register_category_check_duplication_message))
					.setPositiveButton(getResources().getString(R.string.category_register_category_check_duplication_button), 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION));
				}
			}
			
		});
		
		// 입력된 Comment 글자 수를 체크 한다.
		txtViewRegisterCategoryCommentCount = (TextView)findViewById(R.id.txtViewRegisterCategoryCommentCount);
		
		TextWatcher watcher = new TextWatcher() {
			
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				int cnt = s.toString().length();
				txtViewRegisterCategoryCommentCount.setText(String.valueOf(cnt));
				
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		};
		
		// Comment 를 입력 한다.
		edtTextRegisterCategoryComment = (EditText)findViewById(R.id.edtTextRegisterCategoryComment);
		edtTextRegisterCategoryComment.addTextChangedListener(watcher);
		
		// Group 을 선택 한다.
//		spnRegisterCategorySelectGroup = (Spinner)findViewById(R.id.spnRegisterCategorySelectGroup);
//		
//		ArrayList<DayveGroup> groupList = groupDatabaseHandler.selectGroupList("" + 0, "" + 10000);
//		
//		Log.i(TAG, "groupList.size() : " + groupList.size());
//		
//		
//		
//		GroupSpinnerAdapter groupSpinnerAdapter = new GroupSpinnerAdapter(groupList);
//		
////		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.sex, android.R.layout.simple_spinner_item);
//		
////		ArrayAdapter<String> groupList2 = ArrayAdapter.
//		
////		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//
//		spnRegisterCategorySelectGroup.setAdapter(groupSpinnerAdapter);
//		
//		/**
//		 * 만약 GroupInformationView 에서 넘어간 경우 기존 Group Name 을 세팅해준다.
//		 */
//		if(!("").equals(DAYVE_GROUP_ID)) {
//			SPINNER_GROUP_NAME = groupDatabaseHandler.selectGroup(DAYVE_GROUP_ID).getName().toString();
//			
//			for(int j=0 ; j<groupList.size() ; j++) {
//				if((SPINNER_GROUP_NAME).equals(groupList.get(j).getName())) {
//					SPINNER_GROUP_NAME_POSITION = j;
//				}
//			}
//			
//			// 초기값을 세팅 한다.
//			spnRegisterCategorySelectGroup.setSelection(SPINNER_GROUP_NAME_POSITION);
//		}
//		
//		spnRegisterCategorySelectGroup.setOnItemSelectedListener(new OnItemSelectedListener() {
//
//			public void onItemSelected(AdapterView<?> parent, View view,
//					int position, long id) {
//				// TODO Auto-generated method stub
//				DayveGroup dayveGroup = (DayveGroup)parent.getItemAtPosition(position);
////				Toast.makeText(getApplicationContext(), 
////						"group id   : " + dayveGroup.getIdMyHistoryGroups() + "\n" + 
////						"group name : " + dayveGroup.getName(), Toast.LENGTH_SHORT).show();
//				
//				// Group name, comment 를 세팅 한다.
//				txtViewRegisterCategoryName.setText(dayveGroup.getName().toString());
//				txtViewRegisterCategoryComment.setText(dayveGroup.getComment().toString());
//				
//				// Group id, name 을 세팅 한다.
//				DAYVE_GROUP_ID = dayveGroup.getIdMyHistoryGroups();
//				DAYVE_GROUP_NAME = dayveGroup.getName();
//				
//				Log.i(TAG, "DAYVE_GROUP_ID   : " + DAYVE_GROUP_ID);
//				Log.i(TAG, "DAYVE_GROUP_NAME : " + DAYVE_GROUP_NAME);
//			}
//
//			public void onNothingSelected(AdapterView<?> arg0) {
//				// TODO Auto-generated method stub
//				
//			}
//			
//		});
		
		
		
		
		
		// 카테고리를 등록버튼을 터치 한다.
		btnRegisterCategory.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(("").equals(edtRegisterCategoryName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveCategoryRegisterView.this)
					.setTitle(getResources().getString(R.string.category_register_register_category_title))
					.setMessage(getResources().getString(R.string.category_register_register_category_message))
					.setPositiveButton(getResources().getString(R.string.category_register_register_category_button), 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else if(CHECK_DUPLICATION == 0) {
					new AlertDialog.Builder(DayveCategoryRegisterView.this)
					.setTitle(getResources().getString(R.string.category_register_check_register_category_title))
					.setMessage(getResources().getString(R.string.category_register_check_register_category_message))
					.setPositiveButton(getResources().getString(R.string.category_register_check_register_category_button), 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_REGISTER));
				}
			}
			
		});
	}
	
	/**
	 * Group 선택 Spinner 에 세팅하기 위한 어댑터 클래스를 정의 한다.
	 * 
	 * @author johnkim
	 *
	 */
//	private class GroupSpinnerAdapter implements SpinnerAdapter {
//		
//		ArrayList<DayveGroup> data;
//		
//		public GroupSpinnerAdapter(ArrayList<DayveGroup> data) {
//			this.data = data;
//		}
//
//		public int getCount() {
//			// TODO Auto-generated method stub
//			return data.size();
//		}
//
//		public Object getItem(int position) {
//			// TODO Auto-generated method stub
//			return data.get(position);
//		}
//
//		public long getItemId(int position) {
//			// TODO Auto-generated method stub
//			return position;
//		}
//
//		public int getItemViewType(int position) {
//			// TODO Auto-generated method stub
//			return android.R.layout.simple_spinner_dropdown_item;
//		}
//
//		public View getView(int position, View convertView, ViewGroup parent) {
//			// TODO Auto-generated method stub
//			
////			if (convertView == null) {
////			    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
////			    convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
////			}
//			
//			TextView textView = new TextView(getApplicationContext());
//			
//			textView.setTextSize(24);
//			textView.setTextColor(Color.BLACK);
//			textView.setText("  " + data.get(position).getName());
//			
////			convertView = textView;
//			
//			return textView;
//		}
//
//		public int getViewTypeCount() {
//			// TODO Auto-generated method stub
//			return 1;
//		}
//
//		public boolean hasStableIds() {
//			// TODO Auto-generated method stub
//			return false;
//		}
//
//		public boolean isEmpty() {
//			// TODO Auto-generated method stub
//			return false;
//		}
//
//		public void registerDataSetObserver(DataSetObserver observer) {
//			// TODO Auto-generated method stub
//			
//		}
//
//		public void unregisterDataSetObserver(DataSetObserver observer) {
//			// TODO Auto-generated method stub
//			
//		}
//		
//		public View getDropDownView(int position, View convertView,
//				ViewGroup parent) {
//			// TODO Auto-generated method stub
////			if (convertView == null) {
////			    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
////			    convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
////			}
////			
////			TextView textView = new TextView(getApplicationContext());
////			
////			textView.setTextSize(18);
////			textView.setTextColor(Color.BLACK);
////			textView.setText("  " + data.get(position).getName());
////			
////			convertView = textView;
//			
//			return this.getView(position, convertView, parent);
//		}
//		
//	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
		
		Log.i(TAG, "DAYVE_ID : " + DAYVE_ID);
	}
	
	/**
	 * Handler 를 등록 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 로그를 저장한다.
			case THREAD_INSERT_LOG : 
				break;
			// 카테고리명 중복 검사를 한다.
			case THREAD_CHECK_DUPLICATION : 
				threadCheckDuplication();
				break;
			// 카테고리를 등록 한다.
			case THREAD_CATEGORY_REGISTER : 
				threadRegisterCategory();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				registerCategoryProgressBar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				registerCategoryProgressBar.setVisibility(View.INVISIBLE);
				break;
			// 카테고리 저장 성공하면 토스트를 띄운다.
			case THREAD_PROGRESS_REGISTER_SUCCESS : 
				showRegisterCategoryToast();
				break;
			// 카테고리 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
			case THREAD_PROGRESS_REGISTER_FAIL : 
				showDialogRegisterCategoryFail();
				break;
			// 카테고리명 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_AVAILABLE : 
				showDialogCheckDuplicationAvailable();
				break;
			// 카테고리명 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_UNAVAILABLE : 
				showDialogCheckDuplicationUnavailable();
				break;
			// 카테고리명 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_ERROR : 
				showDialogCheckDuplicationError();
				break;
			}
		}
	};

	/**
	 * 화면이 출력되면서 로그를 저장 한다.
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();

		// Category Icon 을 세팅 한다.
		int lid = this.getResources().getIdentifier(DAYVE_CATEGORY_ICON_URL, "drawable", this.getPackageName());
		imgViewCategoryRegisterCategoryIcon.setImageResource(lid);

		// 중복 확인 버튼을 했는지 확인하기 위한 체크 값을 초기화 한다.
//		CHECK_DUPLICATION = 0;
		
//		if(dbHandler == null || !dbHandler.getSQLiteDatabase().isOpen()){ 
//			dbHandler = DatabaseHandler.open(getApplicationContext());
//		}

		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onStart()
	 */
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		
		// 중복 확인 버튼을 했는지 확인하기 위한 체크 값을 초기화 한다.
//		CHECK_DUPLICATION = 0;
	}


	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
//		dbHandler.close();
		
		if(groupDatabaseHandler != null) {
			groupDatabaseHandler.close();
		}
		
//		if(categoryDatabaseHandler != null) {
//			categoryDatabaseHandler.close();
//		}
	}
	
	/**
	 * 만약 뒤로 가기가 가능하다면 등록 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
		
//		finish();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
			DayveCategoryView.activity.finish();
			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}

	/**
	 * 카테고리 중복 검사를 한다.
	 * 
	 * 실제 checkDuplication 메소드에서 처리 한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadCheckDuplication() {
		Log.i(TAG, "threadCheckDuplication");
	
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				checkDuplication();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * 카테고리명 중복 검사를 한다.
	 */
	private void checkDuplication() {
		Log.i(TAG, "checkDuplication");
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setName(edtRegisterCategoryName.getText().toString().trim());
		parameterCategory.setActivateYn("Y");
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		Log.i(TAG, "name               : " + parameterCategory.getName());
		Log.i(TAG, "activateYn         : " + parameterCategory.getActivateYn());
		Log.i(TAG, "myHistoryMembersId : " + parameterCategory.getMyHistoryMembersId());
		
		try {
			RESULT_CHECK_DUPLICATION = dayveCategoryRest.checkDuplication(parameterCategory).getCount();
			
			Log.i(TAG, "RESULT_CHECK_DUPLICATION : " + RESULT_CHECK_DUPLICATION);
			
			// 처리가 끝나면 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 중복 검사 결과에 따라 다이얼로그 창을 띄운다.
		 * 
		 * 1. 카테고리명 등록 가능한 경우.
		 * 2. 이미 등록되어 있는 경우.
		 * 3. 중복 검사시 오류 발생하는 경우.
		 */
		if(("0").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_AVAILABLE));
		} else if(("1").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_UNAVAILABLE));
		} else if(("null").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		} else if(("ERROR").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		}
	}
	
	/**
	 * 카테고리명 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationAvailable() {
		Log.i(TAG, "showDialogCheckDuplicationAvailable");
		
		new AlertDialog.Builder(DayveCategoryRegisterView.this)
		.setTitle(getResources().getString(R.string.category_register_available_register_category_title))
		.setMessage(getResources().getString(R.string.category_register_available_register_category_message))
		.setPositiveButton(getResources().getString(R.string.category_register_available_register_category_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * 카테고리명 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	 * 
	 * 카테고리명 입력란을 지운다.
	 */
	private void showDialogCheckDuplicationUnavailable() {
		Log.i(TAG, "showDialogCheckDuplicationUnavailable");
		
		new AlertDialog.Builder(DayveCategoryRegisterView.this)
		.setTitle(getResources().getString(R.string.category_register_unavailable_register_category_title))
		.setMessage(getResources().getString(R.string.category_register_unavailable_register_category_message))
		.setPositiveButton(getResources().getString(R.string.category_register_unavailable_register_category_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
		
		edtRegisterCategoryName.setText("");
	}
	
	/**
	 * 카테고리명 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationError() {
		Log.i(TAG, "showDialogCheckDuplicationError");
		
		new AlertDialog.Builder(DayveCategoryRegisterView.this)
		.setTitle(getResources().getString(R.string.category_register_error_register_category_title))
		.setMessage(getResources().getString(R.string.category_register_error_register_category_message_01) + "\n" + getResources().getString(R.string.category_register_error_register_category_message_02))
		.setPositiveButton(getResources().getString(R.string.category_register_error_register_category_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * 카테고리를 등록 한다.
	 * 
	 * 실제 로직은 registerCategory 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadRegisterCategory() {
		Log.i(TAG, "threadRegisterCategory");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				registerCategory();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * 카테고리를 등록 한다.
	 */
	private void registerCategory() {
		Log.i(TAG, "registerCategory");
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setName(edtRegisterCategoryName.getText().toString().trim());
		parameterCategory.setComment(edtTextRegisterCategoryComment.getText().toString());
		parameterCategory.setIconUrl(DAYVE_CATEGORY_ICON_URL);
		parameterCategory.setOpenCategoryYn("N");
		parameterCategory.setFavoriteYn("N");
		parameterCategory.setActivateYn("Y");
		parameterCategory.setModifyDate(currentDate);
		parameterCategory.setRegisterDate(currentDate);
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		Log.i(TAG, "name               : " + parameterCategory.getName());
		Log.i(TAG, "comment            : " + parameterCategory.getComment());
		Log.i(TAG, "iconUrl            : " + parameterCategory.getIconUrl());
		Log.i(TAG, "openCategoryYn     : " + parameterCategory.getOpenCategoryYn());
		Log.i(TAG, "favoriteYn         : " + parameterCategory.getFavoriteYn());
		Log.i(TAG, "activateYn         : " + parameterCategory.getActivateYn());
		Log.i(TAG, "modifyDate         : " + parameterCategory.getModifyDate());
		Log.i(TAG, "registerDate       : " + parameterCategory.getRegisterDate());
		Log.i(TAG, "myHistoryMembersId : " + parameterCategory.getMyHistoryMembersId());
		
		try {
			RESULT_CATEGORY_REGISTER = dayveCategoryRest.registerCategory(parameterCategory).getResult();
			
			Log.i(TAG, "RESULT_CATEGORY_REGISTER" + RESULT_CATEGORY_REGISTER);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_CATEGORY_REGISTER)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_REGISTER_SUCCESS));
			
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveGroupInformationView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			/**
			 * category 를 등록한뒤 intent 로 생성하면 main 페이지가 사라진다.
			 * 등록 성공하면 본 register 페이지만 닫는다.
			 */
			// category 목록 화면으로 이동 한다.
//			Intent dayveMainView = new Intent(DayveCategoryRegisterView.this, DayveCategoryView.class);
//			startActivity(dayveMainView);
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_REGISTER_FAIL));
		}
		
		DAYVE_CATEGORY_ICON_URL = "dayve_group_default";
	}
	
	/**
	 * category 등록 실패 다이얼로그 창을 띄운다.
	 */
	private void showDialogRegisterCategoryFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveCategoryRegisterView.this)
		.setTitle(getResources().getString(R.string.category_register_fail_register_category_title))
		.setMessage(getResources().getString(R.string.category_register_fail_register_category_message_01) + "\n" + getResources().getString(R.string.category_register_fail_register_category_message_02))
		.setPositiveButton(getResources().getString(R.string.category_register_fail_register_category_title), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * category 등록 성공 Toast 를 띄운다.
	 */
	private void showRegisterCategoryToast() {
		CharSequence text = getResources().getString(R.string.category_register_success_register_category);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
	
}
